package com.wyw.learning.thread.threadpool;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * 定时任务线程池
 * 使用的是延迟队列DelayedWorkQueue
 * 还有一种线程池，workStealingPool （JDK1.8加入的）（比如递归的场景用）
 *      子任务：比如在二叉树的情况下，左节点继续，矩阵，每四个小矩阵可以继续分为四个小矩阵等等，放到自己的队列中，而不是公共队列
 *      窃取能力：其他线程执行完后，会从其他的线程中获取数据，所以最好不要加锁，也无法保证执行顺序
 *
 * 根据不同的业务场景，自己设置线程池的参数，比如内存有多大，线程名字之类的
 *
 * 实际项目中，将会根据需求的不同，线程数量设置会不同
 *  例如：
 *      CPU密集型（加密，计算hash等），最佳线程数核心是CPU核心的1-2倍左右
 *      耗时IO型（读写数据库、文件、网络读写等）：最佳线程数一般会大于cpu核心数很多倍，以JVM线程监控显示繁忙情况为依据，保证线程空闲可以衔接上，参考Brain Goetz推荐的计算方法。
 *      设置可以采用   线程数=CPU核心数*（1+平均等待时间/平均工作时间）
 *
 * @author Mr Wu    yewen.wu.china@gmail.com
 * @date 2021/7/4   5:50 下午
 * <p>
 * Update History:
 * Author        Time            Content
 */
public class ScheduledThreadPool {
    public static void main(String[] args) {
        //为什么ScheduledThread的keepalived是0：因为任务是周期性的，不需要保留额外的线程，为0就可以快速回收。
        ScheduledExecutorService scheduledExecutorService =
                Executors.newScheduledThreadPool(10);
        scheduledExecutorService.schedule(new Task(), 5, TimeUnit.SECONDS);
        //设置线程初始1是，间隔3s执行
        scheduledExecutorService.scheduleAtFixedRate(new Task(), 1, 3, TimeUnit.SECONDS);
    }
}
